home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / stty.c < prev    next >
C/C++ Source or Header  |  1990-07-23  |  6KB  |  303 lines

  1. /* stty - set terminal mode          Author: Andy Tanenbaum */
  2.  
  3. #include <sgtty.h>
  4. char *on[] = {"tabs", "cbreak", "raw", "-nl", "echo", "odd", "even"};
  5. char *off[] = {"-tabs", "", "", "nl", "-echo", "", ""};
  6. int k;
  7.  
  8. struct sgttyb args;
  9. struct tchars tch;
  10.  
  11. #define STARTC     021        /* CTRL-Q */
  12. #define STOPC     023        /* CTRL-S */
  13. #define QUITC     034        /* CTRL-\ */
  14. #define EOFC     004        /* CTRL-D */
  15. #define DELC    0177        /* DEL */
  16. #define BYTE    0377
  17. #define FD         0        /* which file descriptor to use */
  18.  
  19. #define speed(s) args.sg_ispeed = s;  args.sg_ospeed = s
  20. #define clr1 args.sg_flags &= ~(BITS5 | BITS6 | BITS7 | BITS8)
  21. #define clr2 args.sg_flags &= ~(EVENP | ODDP)
  22.  
  23. main(argc, argv)
  24. int argc;
  25. char *argv[];
  26. {
  27.  
  28.   /* Stty with no arguments just reports on current status. */
  29.   if (ioctl(FD,TIOCGETP,&args)<0 || ioctl(FD,TIOCGETC,(struct sgttyb*)&tch)<0){
  30.     prints("%s: can't read ioctl parameters from stdin\n", argv[0]);
  31.     exit(1);
  32.   }
  33.   if (argc == 1) {
  34.     report();
  35.     exit(0);
  36.   }
  37.  
  38.   /* Process the options specified. */
  39.   k = 1;
  40.   while (k < argc) {
  41.     option(argv[k], k + 1 < argc ? argv[k + 1] : "");
  42.     k++;
  43.   }
  44.   if (ioctl(FD,TIOCSETP,&args)<0 || ioctl(FD,TIOCSETC,(struct sgttyb*)&tch)<0){
  45.     prints("%s: can't write ioctl parameters to stdin\n", argv[0]);
  46.     exit(2);
  47.   }
  48.   exit(0);
  49. }
  50.  
  51.  
  52.  
  53. report()
  54. {
  55.   int mode, ispeed, ospeed;
  56.  
  57.   mode = args.sg_flags;
  58.   pr(mode & XTABS, 0);
  59.   pr(mode & CBREAK, 1);
  60.   pr(mode & RAW, 2);
  61.   pr(mode & CRMOD, 3);
  62.   pr(mode & ECHO, 4);
  63.   pr(mode & ODDP, 5);
  64.   pr(mode & EVENP, 6);
  65.  
  66.   ispeed = 100 * ((int) args.sg_ispeed & BYTE);
  67.   ospeed = 100 * ((int) args.sg_ospeed & BYTE);
  68.   prints("\nkill = ");
  69.   prctl(args.sg_kill);
  70.   prints("\nerase = ");
  71.   prctl(args.sg_erase);
  72.   prints("\nint = ");
  73.   prctl(tch.t_intrc);
  74.   prints("\nquit = ");
  75.   prctl(tch.t_quitc);
  76.   if (ispeed > 0) {
  77.     prints("\nspeed = ");
  78.     switch (ispeed) {
  79.         case 100:    prints("110");    break;
  80.         case 200:    prints("200");    break;
  81.         case 300:    prints("300");    break;
  82.         case 600:    prints("600");    break;
  83.         case 1200:    prints("1200");    break;
  84.         case 1800:    prints("1800");    break;
  85.         case 2400:    prints("2400");    break;
  86.         case 3600:    prints("3600");    break;
  87.         case 4800:    prints("4800");    break;
  88.         case 7200:    prints("7200");    break;
  89.         case 9600:    prints("9600");    break;
  90.         case 19200:    prints("19200");    break;
  91.         default:    prints("unknown");
  92.     }
  93.     switch (mode & BITS8) {
  94.         case BITS5:    prints("\nbits = 5");    break;
  95.         case BITS6:    prints("\nbits = 6");    break;
  96.         case BITS7:    prints("\nbits = 7");    break;
  97.         case BITS8:    prints("\nbits = 8");    break;
  98.     }
  99.   }
  100.   prints("\n");
  101. }
  102.  
  103. pr(f, n)
  104. int f, n;
  105. {
  106.   if (f)
  107.     prints("%s ", on[n]);
  108.   else
  109.     prints("%s ", off[n]);
  110. }
  111.  
  112. option(opt, next)
  113. char *opt, *next;
  114. {
  115.   if (match(opt, "-tabs")) {
  116.     args.sg_flags &= ~XTABS;
  117.     return;
  118.   }
  119.   if (match(opt, "-odd")) {
  120.     args.sg_flags &= ~ODDP;
  121.     return;
  122.   }
  123.   if (match(opt, "-even")) {
  124.     args.sg_flags &= ~EVENP;
  125.     return;
  126.   }
  127.   if (match(opt, "-raw")) {
  128.     args.sg_flags &= ~RAW;
  129.     return;
  130.   }
  131.   if (match(opt, "-cbreak")) {
  132.     args.sg_flags &= ~CBREAK;
  133.     return;
  134.   }
  135.   if (match(opt, "-echo")) {
  136.     args.sg_flags &= ~ECHO;
  137.     return;
  138.   }
  139.   if (match(opt, "-nl")) {
  140.     args.sg_flags |= CRMOD;
  141.     return;
  142.   }
  143.   if (match(opt, "tabs")) {
  144.     args.sg_flags |= XTABS;
  145.     return;
  146.   }
  147.   if (match(opt, "even")) {
  148.     clr2;
  149.     args.sg_flags |= EVENP;
  150.     return;
  151.   }
  152.   if (match(opt, "odd")) {
  153.     clr2;
  154.     args.sg_flags |= ODDP;
  155.     return;
  156.   }
  157.   if (match(opt, "raw")) {
  158.     args.sg_flags |= RAW;
  159.     return;
  160.   }
  161.   if (match(opt, "cbreak")) {
  162.     args.sg_flags |= CBREAK;
  163.     return;
  164.   }
  165.   if (match(opt, "echo")) {
  166.     args.sg_flags |= ECHO;
  167.     return;
  168.   }
  169.   if (match(opt, "nl")) {
  170.     args.sg_flags &= ~CRMOD;
  171.     return;
  172.   }
  173.   if (match(opt, "kill")) {
  174.     args.sg_kill = *next;
  175.     k++;
  176.     return;
  177.   }
  178.   if (match(opt, "erase")) {
  179.     args.sg_erase = *next;
  180.     k++;
  181.     return;
  182.   }
  183.   if (match(opt, "int")) {
  184.     tch.t_intrc = *next;
  185.     k++;
  186.     return;
  187.   }
  188.   if (match(opt, "quit")) {
  189.     tch.t_quitc = *next;
  190.     k++;
  191.     return;
  192.   }
  193.   if (match(opt, "5")) {
  194.     clr1;
  195.     args.sg_flags |= BITS5;
  196.     return;
  197.   }
  198.   if (match(opt, "6")) {
  199.     clr1;
  200.     args.sg_flags |= BITS6;
  201.     return;
  202.   }
  203.   if (match(opt, "7")) {
  204.     clr1;
  205.     args.sg_flags |= BITS7;
  206.     return;
  207.   }
  208.   if (match(opt, "8")) {
  209.     clr1;
  210.     args.sg_flags |= BITS8;
  211.     return;
  212.   }
  213.   if (match(opt, "110")) {
  214.     speed(B110);
  215.     return;
  216.   }
  217.   if (match(opt, "200")) {
  218.     speed(2);
  219.     return;
  220.   }
  221.   if (match(opt, "300")) {
  222.     speed(B300);
  223.     return;
  224.   }
  225.   if (match(opt, "600")) {
  226.     speed(6);
  227.     return;
  228.   }
  229.   if (match(opt, "1200")) {
  230.     speed(B1200);
  231.     return;
  232.   }
  233.   if (match(opt, "1800")) {
  234.     speed(18);
  235.     return;
  236.   }
  237.   if (match(opt, "2400")) {
  238.     speed(B2400);
  239.     return;
  240.   }
  241.   if (match(opt, "3600")) {
  242.     speed(36);
  243.     return;
  244.   }
  245.   if (match(opt, "4800")) {
  246.     speed(B4800);
  247.     return;
  248.   }
  249.   if (match(opt, "7200")) {
  250.     speed(72);
  251.     return;
  252.   }
  253.   if (match(opt, "9600")) {
  254.     speed(B9600);
  255.     return;
  256.   }
  257.   if (match(opt, "19200")) {
  258.     speed(192);
  259.     return;
  260.   }
  261.   if (match(opt, "default")) {
  262.     args.sg_flags = ECHO | CRMOD | XTABS | BITS8;
  263.     args.sg_ispeed = B1200;
  264.     args.sg_ospeed = B1200;
  265.     args.sg_kill = '@';
  266.     args.sg_erase = '\b';
  267.     tch.t_intrc = DELC;
  268.     tch.t_quitc = QUITC;
  269.     tch.t_startc = STARTC;
  270.     tch.t_stopc = STOPC;
  271.     tch.t_eofc = EOFC;
  272.     return;
  273.   }
  274.   std_err("unknown mode: ");
  275.   std_err(opt);
  276.   std_err("\n");
  277.  
  278. }
  279.  
  280. int match(s1, s2)
  281. char *s1, *s2;
  282. {
  283.  
  284.   while (1) {
  285.     if (*s1 == 0 && *s2 == 0) return(1);
  286.     if (*s1 == 0 || *s2 == 0) return (0);
  287.     if (*s1 != *s2) return (0);
  288.     s1++;
  289.     s2++;
  290.   }
  291. }
  292.  
  293. prctl(c)
  294. char c;
  295. {
  296.   if (c < ' ')
  297.     prints("^%c", 'A' + c - 1);
  298.   else if (c == 0177)
  299.     prints("DEL");
  300.   else
  301.     prints("%c", c);
  302. }
  303.